﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using BAL;
using DAL.Entities;
using System.Text.RegularExpressions;

namespace GrouponDesktop
{
    public partial class RegistrarCliente : Form
    {
        private List<CiudadEntity> listado = new List<CiudadEntity>();

        public RegistrarCliente()
        {
            InitializeComponent();
            
            //Obtenemos las ciudades
            CiudadBAL proxy = new CiudadBAL();
            listado = proxy.GetCiudades();

            List<CiudadEntity> listCiu = new List<CiudadEntity>();

            int topPosition = 0;
            //Agregamos todos los checkbox
            foreach (CiudadEntity item in listado)
            {
                CheckBox checkBox = new CheckBox();

                checkBox.Top = topPosition;
                checkBox.Left = 10;
                checkBox.Text = item.IntIdCiudad + " " + item.VarNombre;
                checkBox.Width = 200;

                topPosition += 25;
                this.panel1.Controls.Add(checkBox);
            }


            this.ResumeLayout();
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            try
            {
                if (ValidateForm())
                {
                    ClienteBAL proxy = new ClienteBAL();
                    CiudadBAL proxyCiu = new CiudadBAL();

                    //TODO: VERIFICAR LOS DATOS DE TELEFONO CODIGO PSOTAL Y DNI
                    ClienteEntity client = new ClienteEntity();
                    client.VarNombre = txtNomre.Text;
                    client.VarApellido = txtApellido.Text;
                    client.IntCodigoPostal = (txtCodigoPostal.Text != string.Empty) ? Int32.Parse(txtCodigoPostal.Text) : 0;
                    client.DatFecha_Nac = txtDateBirth.Value;
                    client.VarDireccion = txtDireccion.Text;
                    //client.BigDNI = long.Parse(txtDNI.Text);
                    client.VarMail = txtMail.Text;
                    client.BigTelefono = long.Parse(txtTelefono.Text);

                    client.BigDNI = (txtDNI.Text != string.Empty) ? long.Parse(txtDNI.Text) : 0;
                    client = proxy.AddCliente(client);
                    proxyCiu.DeleteCiudadesFromCliente(client);
                    //Agregamos las funcionaldiades
                    foreach (CheckBox item in panel1.Controls)
                    {
                        if (item.Checked == true)
                        {
                            CiudadEntity ciu = new CiudadEntity();
                            string[] parts = item.Text.Split(' ');
                            ciu.IntIdCiudad = Int32.Parse(parts[0]);
                            proxyCiu.AddCiudadToCliente(ciu, client);
                        }
                    }

                    //Agregamos el password
                    UsuarioEntity user = new UsuarioEntity();
                    UsuarioBAL userProxy = new UsuarioBAL();
                    user.IntIdUsuario = client.IntIdUsuario;
                    user = userProxy.GetUsuarioById(user);
                    user.VarPassword = txtPassword.Text;
                    userProxy.SetPasswordByUsername(user);
                    MessageBox.Show("El usuario se creo exitosamente, su username es: " + txtDNI.Text);
                    this.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ha ocurrido un error: " + ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

        /// <summary>
        /// Funcion que valida si un mail esta bien escrito
        /// </summary>
        /// <param name="email"></param>
        /// <returns></returns>
        private Boolean email_bien_escrito(String email)
        {
            String expresion;
            expresion = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
            if (Regex.IsMatch(email, expresion))
            {
                if (Regex.Replace(email, expresion, String.Empty).Length == 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }

        public bool ValidateForm() {
            bool res = true;
            string errores = string.Empty;


            //Validamos el DNI solo si es un agregar cliente
            if (txtDNI.Text != string.Empty)
            {
                try
                {
                    long algo = long.Parse(txtDNI.Text);
                

                    //Nos fijamos si existe el id
                    ClienteEntity _cliente = new ClienteEntity();
                    ClienteBAL dal = new ClienteBAL();

                    _cliente.BigDNI = (txtDNI.Text != string.Empty) ? long.Parse(txtDNI.Text.ToString()) : 0;
                    //if (clienteInfo.BigDNI != _cliente.BigDNI)
                    //{

                        _cliente = dal.GetClientesByDNI(_cliente);
                        if (_cliente.IntIdCliente != null && _cliente.IntIdCliente != 0)
                        {
                            errores += "El DNI ya esta registrado\n";
                            res = false;
                        }
                    }
                catch (FormatException ex)
                {
                    errores += "El DNI no tiene un formato valido\n";
                    res = false;
                }
                //}
            }
            else {
                errores += "El DNI es obligatorio\n";
                res = false;
            }
            if(txtApellido.Text == string.Empty){
                errores += "El Apellido es obligatorio\n";
                res = false;
            }
            if (txtCodigoPostal.Text == string.Empty)
            {
                errores += "El Codigo Postal es obligatorio\n";
                res = false;
            }
            else {
                try {
                    int algo = Int32.Parse(txtCodigoPostal.Text);
                }catch(FormatException ex){
                    errores += "El Codigo Postal no tiene un formato valido\n";
                    res = false;
                }
            
            }
            if (txtDireccion.Text == string.Empty)
            {
                errores += "La direccion es obligatorio\n";
                res = false;
            }
            if (txtMail.Text == string.Empty)
            {
                errores += "El email es obligatorio\n";
                res = false;
            }
            else { 
                //Validamos el mail
                if (!email_bien_escrito(txtMail.Text))
                {
                    errores += "El email no es valido\n";
                    res = false;
                }
            }

            //Validamos el telefono solo si es un agregar cliente
            if (txtTelefono.Text != string.Empty)
            {
                try
                {
                    long algo = long.Parse(txtTelefono.Text);


                    //Nos fijamos si existe el id
                    ClienteEntity _cliente = new ClienteEntity();
                    ClienteBAL dal = new ClienteBAL();

                    _cliente.BigTelefono = (txtTelefono.Text != string.Empty) ? long.Parse(txtTelefono.Text.ToString()) : 0;
                    _cliente = dal.GetClientesByTelefono(_cliente);
                    if (_cliente.IntIdCliente != null && _cliente.IntIdCliente != 0)
                    {
                        errores += "El Telefono ya esta registrado\n";
                        res = false;
                    }
                }
                catch (FormatException ex)
                {
                    errores += "El telefono no tiene un formato valido\n";
                    res = false;
                }
            }
            else
            {
                errores += "El Telefono es obligatorio\n";
                res = false;
            }



            if (txtNomre.Text == string.Empty)
            {
                errores += "El nombre es obligatorio\n";
                res = false;
            }

            
            //Verificamos el password
            if (txtPassword.Text == string.Empty && txtPasswordConfirm.Text == string.Empty)
            {
                errores += "Debe ingresar un password\n";
                res = false;
            }
            else {
                if (txtPassword.Text != txtPasswordConfirm.Text)
                {
                    errores += "Los password deben coincidir\n";
                    res = false;
                }
            }
            if(errores != string.Empty){
                MessageBox.Show(errores,"Hubo errores");
            }
            return res;
        }

    }
}
